欸,先說,今天這篇是關於 Grafana 的,對,你沒聽錯,就是那個可以把各種指標變成「彩色線條和圖表」的魔法工具。
而且啊,你懂的,作為工程師,我們平常不只是看數字,更多時候是在看自己的人生曲線:CPU 99%、內心焦慮 100%、咖啡杯空了 0%。
好啦,回到正經事。前幾天 Day27 我們裝了 Blackbox Exporter,知道每個 API 活不活。
但是你看一堆 Prometheus metrics,你心情就像看銀行帳單:
probe_success{target="note-api"} 1
probe_duration_seconds{target="note-api"} 0.032
probe_http_status_code{target="note-api"} 200
嗯,看得懂,但老實說,長期這樣會瘋掉。
所以我們需要 Grafana,把這些冷冰冰的數字變成漂亮又直覺的 Dashboard。
就像你早上喝咖啡順便看新聞,不用自己去翻每條新聞源。
先來看一下我們怎麼部署的,順便碎念一下:
Docker Compose 就像把整個監控生態裝進一個便當盒,方便搬來搬去,雖然搬到凌晨還是會卡 Docker network 🤦♂️
networks:
monitor-net:
external: true
langfuse-otel-net:
external: true
services:
note-db:
image: postgres:15
container_name: note-db
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
ports:
- "5411:5432"
volumes:
- ./data/note_db:/var/lib/postgresql/data
- ./db/init-scripts:/docker-entrypoint-initdb.d:ro
networks:
- langfuse-otel-net
- monitor-net
prometheus:
image: prom/prometheus
user: "1001"
volumes:
- ./monitor/prometheus:/etc/config
- ./monitor_data/prometheus_data:/prometheus
- ./monitor/rules:/etc/prometheus/rules
ports:
- "127.0.0.1:9090:9090"
command:
- "--config.file=/etc/config/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--web.console.libraries=/usr/share/prometheus/console_libraries"
- "--web.console.templates=/usr/share/prometheus/consoles"
networks:
- monitor-net
- langfuse-otel-net
- app-net
grafana:
image: grafana/grafana:latest
user: "472"
ports:
- "0.0.0.0:3002:3000"
volumes:
- ./monitor/dashboards:/var/lib/grafana/dashboards # dashboard JSON, Node Exporter Full: 1860 , cAdvisor Exporter: 14282 , Prometheus Blackbox Exporter: 7587
- ./monitor/provisioning:/etc/grafana/provisioning # provisioning 設定
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD:-admin}
GF_SECURITY_ADMIN_USER: ${GF_SECURITY_ADMIN_USER:-admin}
GF_SECURITY_SECRET_KEY: ${GRAFANA_SECRET_KEY:-admin}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_USERS_ALLOW_ORG_CREATE: "false"
GF_AUTH_ANONYMOUS_ENABLED: "false"
GF_SECURITY_ALLOW_EMBEDDING: "true"
restart: always
networks:
- monitor-net
欸,老實說,這裡最討厭的就是 network 配錯,你會看著 Dashboard 白屏,心裡默念「我到底在監控什麼人生」。
Grafana 是展示工具,但它不會自己去抓 DB 或 Prometheus,你得告訴它「去哪裡撈數據」。
這就是 Datasource。好啦,我承認,我第一次弄時差點以為要寫 SQL 才能看 metric 🤦♂️
PostgreSQL
apiVersion: 1
datasources:
- name: postgresql
type: postgres
access: proxy
url: note-db:5432
isDefault: false
editable: true
user: user
database: note
jsonData:
sslmode: disable
postgresVersion: 1300
secureJsonData:
password: password
prometheus
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
jsonData:
defaultDatabase: default
tlsAuth: false
tlsAuthWithCACert: false
欸,這裡要注意,如果 URL 或 port 配錯,Dashboard 就像失戀一樣——只剩空白,什麼都抓不到。
好了,接下來你想要自動化載入 Dashboard,就得用 provisioning,免得每次手動 import,老實說那種事我寧願去倒咖啡。
apiVersion: 1
providers:
- name: 'All Dashboards'
orgId: 1
folder: ''
type: file
disableDeletion: false
options:
path: /var/lib/grafana/dashboards
- name: 'System Dashboards'
orgId: 1
folder: 'System Metrics'
type: file
disableDeletion: false
options:
path: /var/lib/grafana/dashboards/system
- name: 'App Dashboards'
orgId: 1
folder: 'App Metrics'
type: file
disableDeletion: false
options:
path: /var/lib/grafana/dashboards/app
我第一次弄這個,結果弄到凌晨 2 點才發現 JSON 檔少一個逗號…人生啊,逗號都比我懂細節。
欸,你如果像我一樣,專案亂放,那 Dashboard JSON 找不到比找女朋友還難。
.
├── alertmanager
│ └── alertmanager.yml
├── blackbox
│ └── blackbox.yml
├── dashboards
│ ├── app
│ │ ├── dashboard_apiGateway.json
│ │ ├── dashboard_noteservice.json
│ │ └── dashboard_redis_db_calling.json
│ ├── dashboard_data_analystics.json
│ ├── system
│ │ ├── blackbox_exporter.json
│ │ ├── cadvisor.json
│ │ └── node_exporter_full.json
│ └── top-level.json
├── prometheus
│ └── prometheus.yml
├── provisioning
│ ├── dashboards
│ │ └── dashboards.yml
│ └── datasources
│ ├── postgresql.yml
│ └── prometheus.yml
├── readme.md
└── rules
└── rule.yml
直接使用 別人寫好的 dashbaord
Node Exporter
cAdvisor
Blackbox Exporter
FastAPI
好啦,聊完 Grafana Dashboard 長什麼樣,我們先回顧看看 Prometheus 怎麼抓資料,因為沒有資料,Dashboard 再漂亮也只是一堆彩色方塊。
我把你目前的 prometheus.yml 拿出來整理一下,順便標記哪些是 Node Exporter、cAdvisor、Blackbox、FastAPI 的 metrics。
global:
scrape_interval: 15s # 每 15 秒抓一次 metrics
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager:9093"
rule_files:
- "/etc/prometheus/rules/*.yml"
這是全域設定,告訴 Prometheus:
Host / Container 層 metrics
scrape_configs:
- job_name: 'app_metrics'
static_configs:
- targets:
- 'node-exporter:9100'
- 'cadvisor:8080'
node-exporter:9100 → Node Exporter
cadvisor:8080 → cAdvisor
FastAPI / Application metrics
- job_name: 'noteserver'
static_configs:
- targets: ['noteserver:8000']
/metrics 預設抓 FastAPI 指標Blackbox Exporter:外部視角健康檢查
- job_name: 'blackbox-http-health'
metrics_path: /probe
params:
module: [http_2xx_health]
Targets: noteserver, apiGateway, open-webui, note-storage, ollama, note-qdrant, langfuse-web, grafana, prometheus
Metrics:
probe_success → 1/0probe_duration_seconds → 延遲probe_http_status_code → HTTP 回應碼💭 碎念:probe_success = 1,但 HTTP 500 → API 活,但在翻白眼
- job_name: 'blackbox-tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- 'note-db:5432'
- 'redis:6379'
- 'note-qdrant:6333'
- 'note-storage:9000'
Metrics:
probe_success → 1/0probe_duration_seconds → TCP 連線延遲💭 碎念:就像戳一下門鈴,看屋主在不在家
Metrics 層級理解
| Job Name | Metric 類型 | Layer | 心態比喻 |
|---|---|---|---|
| app_metrics/node-exporter | Node Exporter metrics | Host / OS | 血壓、心跳、體重秤 |
| app_metrics/cadvisor | cAdvisor metrics | Container | 拖延症同事的效率 |
| api_gateway / noteserver | FastAPI metrics | Application | 心跳、API 活躍度 |
| blackbox-http-health | Blackbox HTTP probe | External API / Health | 外部戳一下 API,看活不活 |
| blackbox-tcp | Blackbox TCP probe | TCP Service / DB | 戳門鈴看屋主在不在 |
💭 :
| Panel 類型 | 適用場景 | 建議 |
|---|---|---|
| Graph / Time series | 時間序列指標 | CPU、Memory、API Latency |
| Stat / Gauge | 單一指標一目了然,瞬間知道狀態 | Probe 成功率、心跳指標 |
| Table | 多個 target 的即時狀態 | Blackbox Exporter 成功/失敗列表 |
| Heatmap | 適合高維度、密集的容器使用量 | Container 資源使用量 |


Grafana 的意義:把 Prometheus、Blackbox、cAdvisor、FastAPI 的各種指標,轉化為直覺、彩色 Dashboard,方便快速掌握系統健康。
部署關鍵:Docker Compose 整合 Grafana、Prometheus、DB,network 配置務必正確,避免 Dashboard 白屏。
Datasource:Grafana 需正確指向 Prometheus 或 PostgreSQL,URL/Port 配錯就抓不到資料。
Dashboard Provisioning:自動化載入 JSON Dashboard,免去每次手動 import 的麻煩。
Metrics 層級理解:
可視化 Panel 建議:
💭 核心理念:看內部(Node Exporter / cAdvisor)→ 看應用(FastAPI)→ 看外部(Blackbox),三層結合,全面掌握系統健康狀態。